package src;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;

public class FileListPanel extends JPanel {
    private DefaultListModel<File> listModel; // 用于存储文件列表的数据模型
    private JList<File> fileList; // 文件列表组件
    private JTextField filePathField; // 显示当前选中文件路径的文本字段
    private JButton backButton; // 返回上级目录的按钮
    private JTextField searchField; // 搜索框
    private JButton searchButton; // 搜索按钮
    private JButton renameButton; // 重命名按钮
    private File currentDirectory; // 当前目录

    private File selectedFile; // 当前选中的文件

    /**
     * 构造函数，初始化文件列表面板
     */
    public FileListPanel() {
        setLayout(new BorderLayout()); // 设置布局管理器为BorderLayout
        listModel = new DefaultListModel<>(); // 初始化数据模型
        fileList = new JList<>(listModel); // 初始化文件列表组件
        fileList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); // 设置选择模式为单选
        fileList.setCellRenderer(new FileListCellRenderer()); // 设置单元格渲染器
        fileList.addListSelectionListener(e -> {
            if (!e.getValueIsAdjusting()) {
                selectedFile = fileList.getSelectedValue(); // 获取选中的文件
                if (selectedFile != null && selectedFile.canRead()) {
                    filePathField.setText(selectedFile.getAbsolutePath()); // 更新文件路径字段
                    firePropertyChange("selectedFile", null, selectedFile); // 触发属性更改事件
                }
            }
        });
        JScrollPane fileScrollPane = new JScrollPane(fileList); // 创建滚动面板并包含文件列表
        add(fileScrollPane, BorderLayout.CENTER); // 将滚动面板添加到中心位置

        // 后退按钮
        JPanel topPanel = new JPanel();
        backButton = new JButton("Back"); // 初始化后退按钮
        backButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                navigateUp(); // 处理后退按钮点击事件
            }
        });
        topPanel.add(backButton); // 将后退按钮添加到顶部面板

        // 文件路径字段
        filePathField = new JTextField(40); // 初始化文件路径字段
        filePathField.setEditable(false); // 文件路径字段不可编辑
        topPanel.add(filePathField); // 将文件路径字段添加到顶部面板

        add(topPanel, BorderLayout.NORTH); // 将顶部面板添加到北部位置

        // 搜索面板
        JPanel searchPanel = new JPanel();
        searchField = new JTextField(20); // 初始化搜索框
        searchButton = new JButton("Search"); // 初始化搜索按钮
        searchButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                performGlobalSearch(searchField.getText()); // 处理搜索按钮点击事件
            }
        });

        searchField.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                performGlobalSearch(searchField.getText()); // 处理搜索框回车键事件
            }
        });

        searchPanel.add(searchField); // 将搜索框添加到搜索面板
        searchPanel.add(searchButton); // 将搜索按钮添加到搜索面板

        // 重命名按钮
        renameButton = new JButton("Rename"); // 初始化重命名按钮
        renameButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                renameFile(); // 处理重命名按钮点击事件
            }
        });
        searchPanel.add(renameButton); // 将重命名按钮添加到搜索面板

        add(searchPanel, BorderLayout.SOUTH); // 将搜索面板添加到南部位置

        refreshFileList(); // 刷新文件列表

        // 添加鼠标监听器以打开目录
        fileList.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                if (evt.getClickCount() == 2) {
                    File selectedFile = fileList.getSelectedValue(); // 获取双击的文件
                    if (selectedFile != null && selectedFile.isDirectory()) {
                        updateFileList(selectedFile); // 更新文件列表
                    }
                }
            }
        });
    }

    /**
     * 设置文件路径字段
     *
     * @param filePathField 文件路径字段
     */
    public void setFilePathField(JTextField filePathField) {
        this.filePathField = filePathField;
    }

    /**
     * 获取选中文件的路径
     *
     * @return 选中文件的绝对路径
     */
    public String getSelectedFilePath() {
        return selectedFile != null ? selectedFile.getAbsolutePath() : "";
    }

    /**
     * 获取选中的文件
     *
     * @return 选中的文件对象
     */
    public File getSelectedFile() {
        return selectedFile;
    }

    /**
     * 刷新文件列表，让用户选择一个目录
     */
    public void refreshFileList() {
        JFileChooser fileChooser = new JFileChooser(); // 初始化文件选择器
        fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); // 设置选择模式为仅目录
        fileChooser.setDialogTitle("Select a Directory"); // 设置对话框标题
        int returnValue = fileChooser.showOpenDialog(this); // 显示文件选择对话框
        if (returnValue == JFileChooser.APPROVE_OPTION) {
            File directory = fileChooser.getSelectedFile(); // 获取用户选择的目录
            if (directory != null && directory.isDirectory()) {
                currentDirectory = directory; // 更新当前目录
                updateFileList(directory); // 更新文件列表
            }
        }
    }

    /**
     * 更新文件列表显示指定目录的内容
     *
     * @param directory 要显示的目录
     */
    public void updateFileList(File directory) {
        if (directory != null && directory.isDirectory()) {
            currentDirectory = directory; // 更新当前目录
            listModel.clear(); // 清空数据模型
            File[] files = directory.listFiles(); // 获取目录中的文件和子目录
            if (files != null) {
                for (File file : files) {
                    listModel.addElement(file); // 将文件添加到数据模型
                }
            }
            filePathField.setText(currentDirectory.getAbsolutePath()); // 更新文件路径字段
        }
    }

    /**
     * 导航到上级目录
     */
    private void navigateUp() {
        if (currentDirectory != null && currentDirectory.getParentFile() != null) {
            updateFileList(currentDirectory.getParentFile()); // 更新文件列表为上级目录
        }
    }

    /**
     * 执行全局搜索
     *
     * @param query 搜索关键字
     */
    private void performGlobalSearch(String query) {
        if (query == null || query.isEmpty()) {
            JOptionPane.showMessageDialog(this, "Please enter a search term.", "Error", JOptionPane.ERROR_MESSAGE); // 显示错误消息对话框
            return;
        }

        if (currentDirectory == null) {
            JOptionPane.showMessageDialog(this, "Please select a directory first.", "Error", JOptionPane.ERROR_MESSAGE); // 显示错误消息对话框
            return;
        }

        listModel.clear(); // 清空数据模型
        searchFiles(currentDirectory, query.toLowerCase()); // 开始搜索
    }

    /**
     * 递归搜索文件
     *
     * @param directory 当前搜索的目录
     * @param query 搜索关键字
     */
    private void searchFiles(File directory, String query) {
        File[] files = directory.listFiles(); // 获取目录中的文件和子目录
        if (files != null) {
            for (File file : files) {
                if (file.getName().toLowerCase().contains(query)) {
                    listModel.addElement(file); // 将匹配的文件添加到数据模型
                }
                if (file.isDirectory()) {
                    searchFiles(file, query); // 递归搜索子目录
                }
            }
        }
    }

    /**
     * 重命名选中的文件或目录
     */
    public void renameFile() {
        if (selectedFile == null) {
            JOptionPane.showMessageDialog(this, "No file or directory selected.", "Error", JOptionPane.ERROR_MESSAGE);
            return;
        }

        String newName = JOptionPane.showInputDialog(this, "Enter new name:", selectedFile.getName());
        if (newName == null || newName.trim().isEmpty()) {
            JOptionPane.showMessageDialog(this, "Invalid new name.", "Error", JOptionPane.ERROR_MESSAGE);
            return;
        }

        File newFile = new File(selectedFile.getParent(), newName);
        if (newFile.exists()) {
            JOptionPane.showMessageDialog(this, "A file or directory with that name already exists.", "Error", JOptionPane.ERROR_MESSAGE);
            return;
        }

        if (selectedFile.renameTo(newFile)) {
            updateFileList(currentDirectory);
            JOptionPane.showMessageDialog(this, "Renamed successfully.", "Success", JOptionPane.INFORMATION_MESSAGE);
        } else {
            JOptionPane.showMessageDialog(this, "Failed to rename.", "Error", JOptionPane.ERROR_MESSAGE);
        }
    }

    /**
     * 自定义文件列表单元格渲染器
     */
    private static class FileListCellRenderer extends JLabel implements ListCellRenderer<File> {
        @Override
        public Component getListCellRendererComponent(JList<? extends File> list, File value, int index, boolean isSelected, boolean cellHasFocus) {
            setText(value.getName()); // 设置文件名
            if (value.isDirectory()) {
                File[] files = value.listFiles(); // 获取目录中的文件和子目录
                int count = files != null ? files.length : 0;
                setText(value.getName() + " (" + count + ")"); // 设置目录名和文件数量
            }
            if (isSelected) {
                setBackground(list.getSelectionBackground()); // 设置选中背景颜色
                setForeground(list.getSelectionForeground()); // 设置选中前景颜色
            } else {
                setBackground(list.getBackground()); // 设置非选中背景颜色
                setForeground(list.getForeground()); // 设置非选中前景颜色
            }
            setOpaque(true); // 设置透明度
            return this;
        }
    }
}